home *** CD-ROM | disk | FTP | other *** search
/ Macworld Expo - Develope…Central & Net Innovations / Developer Central and Net Innovators (MacWorld Expo) (January 1999).iso / Developer Central / Bowers Development / Demo AppMaker / Examples / plain C OS8 / Everything / MainMenu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-29  |  6.0 KB  |  297 lines  |  [TEXT/CWIE]

  1. /* MainMenu.c */
  2.  
  3. #include <Types.h>
  4. #include <Quickdraw.h>
  5. #include <Controls.h>
  6. #include <Dialogs.h>
  7. #include <Events.h>
  8. #include <Lists.h>
  9. #include <LowMem.h>
  10. #include <Menus.h>
  11. #include <TextEdit.h>
  12. #include <ToolUtils.h>
  13.  
  14. #include "Globals.h"
  15. #include "ResourceDefs.h"
  16. #include "Miscellany.h"
  17. #include "AMApp.h"
  18. #include "AMEngine.h"
  19. #include "AMWindow.h"
  20. #include "Dispatcher.h"
  21. #include "EverythingDoc.h"
  22. #include "MainMenu.h"
  23.  
  24.  
  25. /*----------*/
  26. static long        GetCommandFromMenu (long        menuChoice);
  27. static void        DoApple            (short            itemNr);
  28. static void        Enable            (short            itemNr,
  29.                                  Boolean        enabled);
  30. static void        EnableTitle        (MenuHandle        menu,
  31.                                  Boolean        enabled);
  32.  
  33. /*----------*/
  34. void    InitTitles (void)
  35. {
  36. } /*InitTitles*/
  37.  
  38. /*----------*/
  39. void    LoadMenus (void)
  40. {
  41.     AppleMenu    = GetMenu (MENU_Apple);
  42.     FailNilResource ((Handle)AppleMenu);
  43.     AppendResMenu (AppleMenu, 'DRVR');
  44.     FileMenu    = GetMenu (MENU_File);
  45.     EditMenu    = GetMenu (MENU_Edit);
  46.     PopupMenu    = GetMenu (MENU_Popup);
  47.     ModalMenu    = GetMenu (MENU_Modal);
  48.     ModelessMenu    = GetMenu (MENU_Modeless);
  49.     BevelMenu    = GetMenu (MENU_Bevel);
  50.  
  51.     InsertMenu (AppleMenu, 0);
  52.     InsertMenu (FileMenu, 0);
  53.     InsertMenu (EditMenu, 0);
  54.     InsertMenu (ModalMenu, 0);
  55.     InsertMenu (ModelessMenu, 0);
  56.  
  57.     DrawMenuBar ();
  58. } /*LoadMenus*/
  59.  
  60. //----------
  61. long    GetCommandFromMenu (
  62.     long        menuChoice)
  63. {
  64.     long        commandID = 0;
  65.  
  66.     switch (menuChoice) {
  67.         case cAppleAbout:
  68.                 commandID = cmdInvokeAbout;
  69.             break;
  70.         case cFileNew:
  71.                 commandID = cmdNew;
  72.             break;
  73.         case cFileOpen:
  74.                 commandID = cmdOpen;
  75.             break;
  76.         case cFileClose:
  77.                 commandID = cmdClose;
  78.             break;
  79.         case cFileSave:
  80.                 commandID = cmdSave;
  81.             break;
  82.         case cFileSaveAs:
  83.                 commandID = cmdSaveAs;
  84.             break;
  85.         case cFileRevert:
  86.                 commandID = cmdRevert;
  87.             break;
  88.         case cFilePageSetup:
  89.                 commandID = cmdPageSetup;
  90.             break;
  91.         case cFilePrint:
  92.                 commandID = cmdPrint;
  93.             break;
  94.         case cFileQuit:
  95.                 commandID = cmdQuit;
  96.             break;
  97.         case cEditUndo:
  98.                 commandID = cmdUndo;
  99.             break;
  100.         case cEditCut:
  101.                 commandID = cmdCut;
  102.             break;
  103.         case cEditCopy:
  104.                 commandID = cmdCopy;
  105.             break;
  106.         case cEditPaste:
  107.                 commandID = cmdPaste;
  108.             break;
  109.         case cEditClear:
  110.                 commandID = cmdClear;
  111.             break;
  112.         case cEditSelectAll:
  113.                 commandID = cmdSelectAll;
  114.             break;
  115.         case cEditShowClipboard:
  116.                 commandID = cmdShowClipboard;
  117.             break;
  118.         case cModalButtons:
  119.                 commandID = cmdModalButtons;
  120.             break;
  121.         case cModalCheckboxes:
  122.                 commandID = cmdModalCheckboxes;
  123.             break;
  124.         case cModalRadios:
  125.                 commandID = cmdModalRadios;
  126.             break;
  127.         case cModalText:
  128.                 commandID = cmdModalText;
  129.             break;
  130.         case cModalStuff:
  131.                 commandID = cmdModalStuff;
  132.             break;
  133.         case cModalMoreStuff:
  134.                 commandID = cmdModalMoreStuff;
  135.             break;
  136.         case cModelessButtons:
  137.                 commandID = cmdModelessButtons;
  138.             break;
  139.         case cModelessCheckboxes:
  140.                 commandID = cmdModelessCheckboxes;
  141.             break;
  142.         case cModelessRadios:
  143.                 commandID = cmdModelessRadios;
  144.             break;
  145.         case cModelessText:
  146.                 commandID = cmdModelessText;
  147.             break;
  148.         case cModelessStuff:
  149.                 commandID = cmdModelessStuff;
  150.             break;
  151.         case cModelessMoreStuff:
  152.                 commandID = cmdModelessMoreStuff;
  153.             break;
  154.  
  155.         default:
  156.                 commandID = -menuChoice;
  157.     }
  158.  
  159.     return commandID;
  160. }
  161.  
  162. //----------
  163. void    DoApple (
  164.     short        itemNr)
  165. {
  166.     Str255            name;
  167.     short            refNum;
  168.  
  169.     GetMenuItemText (AppleMenu, itemNr, name);
  170.     refNum = OpenDeskAcc (name);
  171. }
  172.  
  173. /*----------*/
  174. void    DoMenu (
  175.     long        menuChoice)
  176. {
  177.     long            commandID;
  178.     AMDoc*            curDoc;
  179.     short            menuID;
  180.     short            itemNr;
  181.  
  182.     commandID = GetCommandFromMenu (menuChoice);
  183.     curDoc = cur->mDoc;
  184.     if (DoCommand (cur, commandID)) {    // Dispatch
  185.         // cur window handled it
  186.     } else if ((curDoc != nil)
  187.     && (DoDocCommand (curDoc, commandID))) {
  188.         // document handled it
  189.     } else if (DoAppCommand (gApplication, commandID)) {
  190.         // application handled it
  191.     } else {
  192.         menuID = HiWord (menuChoice);
  193.         itemNr = LoWord (menuChoice);
  194.         if (menuID == MENU_Apple) {
  195.             DoApple (itemNr);
  196.         }
  197.     }
  198.  
  199.     HiliteMenu (0);
  200. } /*DoMenu*/
  201.  
  202. /*----------*/
  203. MenuHandle        menu;
  204. Boolean            menuBarChanged;
  205.  
  206. /*----------*/
  207. static void Enable    (short        itemNr,
  208.                      Boolean    enabled)
  209. {
  210.     if (enabled) {
  211.         EnableItem  (menu, itemNr);
  212.     } else {
  213.         DisableItem (menu, itemNr);
  214.     }
  215. } /*Enable*/
  216.  
  217. /*----------*/
  218. static void EnableTitle    (MenuHandle        menu,
  219.                          Boolean        enabled)
  220. {
  221.     if (enabled != ((**menu).enableFlags & 1)) {
  222.         menuBarChanged = true;
  223.     }
  224.     if (enabled) {
  225.         EnableItem  (menu, 0);
  226.     } else {
  227.         DisableItem (menu, 0);
  228.     }
  229. } /*EnableTitle*/
  230.  
  231. /*----------*/
  232. void    UpdateMenus (void)
  233. {
  234.     WindowPeek        frontPeek;
  235.     Boolean            isFront;        /*is there a front window?*/
  236.     Boolean            isCur;            /*is there a current window?*/
  237.     Boolean            isCurDoc;        /*is there a current document?*/
  238.     Boolean            isDirty;        /*is it dirty?*/
  239.     Boolean            hasFile;        /*does it have a file?*/
  240.     Boolean            isSelected;        /*is anything selected?*/
  241.     Boolean            isDesk;            /*is the front window a desk acc?*/
  242.     Boolean            isText;            /*is there a current text field?*/
  243.     Boolean            isScrap;        /*is there any scrap?*/
  244.     TEHandle        curTE;
  245.  
  246.     menuBarChanged = false;
  247.  
  248.     isFront        = (FrontWindow () != nil);
  249.     isCur        = (curWindow != nil);
  250.     isDirty        = false;
  251.     hasFile        = false;
  252.     isSelected    = false;
  253.     isCurDoc    = (cur->mDoc != nil);
  254.     if (isCurDoc) {
  255.         isDirty        = AMEngine_IsDirty (cur->mDoc->mEngine);
  256.         hasFile        = AMEngine_HasFile (cur->mDoc->mEngine);
  257.     }
  258.  
  259.     isDesk = false;
  260.     if (isFront) {
  261.         frontPeek    = (WindowPeek) FrontWindow ();
  262.         isDesk        = (frontPeek->windowKind < 0);
  263.     }
  264.  
  265.     curTE = AMWindow_GetCurTE (cur);
  266.  
  267.     isText        = (curTE != nil);
  268.     isScrap        = false;
  269.     if (isText) {
  270.         isSelected    = ((**curTE).selStart != (**curTE).selEnd);
  271.         isScrap        = (TEGetScrapLength () > 0);
  272.     }
  273.  
  274.     menu = FileMenu;
  275.     Enable (cFileClose,        isFront);
  276.     Enable (cFileSave,        isDirty);
  277.     Enable (cFileSaveAs,    isCur);
  278.     Enable (cFileRevert,    isDirty);
  279.  
  280.     menu = EditMenu;
  281.     if (isFront) {
  282.         Enable (cEditUndo,        isDesk);
  283.         Enable (cEditCut,        isDesk || isSelected);
  284.         Enable (cEditCopy,        isDesk || isSelected);
  285.         Enable (cEditPaste,        isDesk || isScrap);
  286.         Enable (cEditClear,        isDesk || isSelected);
  287.         Enable (cEditSelectAll,    isText);
  288.  
  289.     }
  290.     EnableTitle (EditMenu,     isFront);
  291.  
  292.  
  293.     if (menuBarChanged) {
  294.         DrawMenuBar ();
  295.     }
  296. } /*UpdateMenus*/
  297.